%% ------------------------------------------------------------------------- %%
\chapter{Sistema Proposto}
\label{cap:sistema}

O sistema desenvolvido neste trabalho foi escrito em Shell Script para evidenciar o poder desta linguagem e de como ela pode ser utilizada para diferentes situações. Neste sistema produziu-se um código limpo, com comentários elucidativos, para tornar a sua manutenção e a inclusão de novas funcionalidade uma tarefa simples, podendo assim se adptar as necessidades de seus utilizadores.

A linguagem Shell Script, se diferencia de outras linguagens compiladas, pois, como é interpretada, o utilizador tem todo o código fonte à sua disposição e o utilizador tem o conhecimento do que exatamente o código irá realizar, em programas compilados, geralmente, se tem unicamente o binário que será executado. Pelo o exposto, uma aplicação escrita em Shell Script oferece segurança e confiabilidade para o usuário que utiliza uma aplicação não consolidada.

Neste capítulo é descrito toda a aplicação proposta e o modo como foi desenvolvida, será exposto sua arquitetura, software utilizado para criar a interface gráfica do usuário, seus módulos e como são criados os aquivos de log da aplicação, no Apêndice~\ref{ape:base} é disponibilizado todo o código fonte da aplicação proposta.

\section{Arquitetura}

Esta aplicação foi desenvolvida utilizando-se uma estrutura modular em que, de acordo com a seleção do usuário, o fluxo principal executa suas respectivas funções que chamaremos aqui de módulos. Na Figura~\ref{fig:arqsistema} pode-se observar como esse fluxo é executado.

	\begin{figure}[!h]
	\centering
	\includegraphics[width=.80\textwidth]{arquitetura} 
	\caption{Arquitetura do sistema}
	\label{fig:arqsistema} 
	\end{figure}

Como pode-se observar, no momento em que o usuário executa a aplicação, duas funções de verificação são executadas, na primeira função verifica-se se o usuário está utilizando o sistema com a conta root\footnote{Conta de super-usuário com poderes administrativos}, pois, a utilização da conta de super-usuário se faz necessária para a instalação e remoção dos pacotes disponibilizados na aplicação. Como pode-se observar no trecho de código~\ref{cod:verroot}, na primeira linha da função, testa-se se o uid do usuário é diferente de 0, pois o uid do usuário root é sempre esse valor, se não for obtido esse valor, a função escreve o erro na tela do usuário e no log da aplicação, em seguida a aplicação é encerrada.

\begin{lstlisting}[caption={Verificação de Super-Usuário}, label=cod:verroot, language=bash]
#Funcao 01 - Verifica se o Usuario e ROOT
function verificaRoot(){
	if [ "$(id -u)" != "0" ]
		then 
	MENSAGEM_ERRO_ROOT="
ERRO DE EXECUCAO:
Este programa so podera executar todas as suas funcionalidades no modo super-usuario.
Por favor, faca login com o super usuario e execute o $(basename "$0") novamente.
"
		echo "$MENSAGEM_ERRO_ROOT"
		echo "ERRO - "`date +%d/%m/%Y-%H:%M:%S`" - Usuario nao e ROOT" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
		exit 1
fi
}
\end{lstlisting}

A segunda verificação, busca se o Dialog está diponível no sistema, caso não esteja, a aplicação pergunta ao usuário se ele deseja proceder com a instalação do Dialog, caso a resposta seja sim, realiza a instalação, caso o usuário responda não, é gerado um erro no arquivo de log referente a aquela execução e uma mensagem notifica o usuário que o Dialog é essencial para o correto funcionamento da ferramenta conforme o código~\ref{cod:verdialog}. O Dialog é essencial para a correta execução, pois é esta ferramenta que gera a interface gráfica de interação com o usuário.

\begin{lstlisting}[caption={Verificação do Dialog}, label=cod:verdialog, language=bash]
#Funcao 02 - Verifica se o Dialog esta instalado no sistema
function verificaDialog(){
	check_install dialog
	if [ $? -eq 0 ]
	then
		MENSAGEM_ERRO_DIALOG="
O aplicativo Dialog e necessario a execucao e nao esta instalado no seu sistema.
Sem ele nao e possivel executar esta aplicacao. Deseja instalar o dialog para prosseguir com a execucao?[Y/n]
"
		echo "$MENSAGEM_ERRO_DIALOG"
		read resposta
		if [ $resposta = "Y"  -o $resposta = "y" ]
		then
			echo "Iniciando a Instalacao do Dialog!"
			apt-get -y install dialog
			echo "INSTALL - "`date +%d/%m/%Y-%H:%M:%S`" - INSTALOU DIALOG" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
			dialog --title 'Sucesso na Instalacao' --sleep 3 --infobox 'Dialog instalado com sucesso!nAguarde...\nIniciando a Aplicacao ...\n' 0 0
		else
			MENSAGEM_ERRO_DIALOG="
ERRO DE EXECUCAO:			
Voce escolheu nao instalar o Dialog, se desejar executar o programa novamente,
responda Y para a pergunta anterior para a instalacao do Dialog e a correta execucao deste programa.
Saindo da Aplicacao
"
			echo "$MENSAGEM_ERRO_DIALOG"
			echo "ERRO - "`date +%d/%m/%Y-%H:%M:%S`" - Dialog Nao Instalado" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
			exit 1
		fi
	else
		echo "Dialog instalado"
	fi
}
\end{lstlisting} 

Após as devidas verificações, o sistema entra em seu fluxo principal no qual o usuário pode interagir nas interfacer geradas pelo Dialog ou atrvés da verificação dos logs do sistema.

\section{Opções de Linha de Comando}

Foi adicionado na aplicação três opções de linha de comando, -h ou --help, -c ou --changelog e -v ou --version, na primeira opção, mostra-se ao usuário uma mensagem de uso da ferramenta informando que os parâmetros citados são opcionais, na segunda opção mostra-se o changelog da aplicação com todas as versões e qual foi a melhoria incluída dos dados contidos no cabeçalho do script e na terceira opção é extraído a versão atual do sistema, conforme podemos observar no trecho~\ref{cod:linhacomando}, é tratato também o erro referente a passagem de parâmetro inválido.

Podemos dar início a execução da aplicação apenas passando o seu nome normalmente ou passando os parâmetros mencionados, conforme o exemplo:

\begin{verbatim}
./tcc.sh
ou
./tcc.sh [-h | -v]
\end{verbatim}

\begin{lstlisting}[caption={Opções de Linha de Comando}, label=cod:linhacomando, language=bash]
#Tratando Opcoes da linha de Comando

MENSAGEM_USO="
Uso: $(basename "$0") [-h | -v ]

-h , --help		Mostra essa ajuda e sai
-v , --version	Mostra a versao do programa
"

case "$1" in
	-h | --help)
		echo "$MENSAGEM_USO"
		exit 0
	;;
	-c | --changelog)
		echo "Change Log da Aplicação $(basename "$0"):"
		cat `echo $0` | grep '^# Versão'
		exit 0
	;;
	-v | --version)
		echo -n $(basename "$0") -
		#Extrai a versao diretamante do cabecalho do programa
		grep '^# Versao ' "$0" | tail -1 | cut -d - -f 1 | tr -d \#
		exit 0
	;;
	*)
		if test -n "$1"
		then
			echo Opcao Invalida: $1
			echo "Escolha '$(basename "$0") -h' ou '$(basename "$0") --help' para obter ajuda"
			exit 1
		fi
	;;
esac
\end{lstlisting}

Na Figura~\ref{fig:linhacomando}, podemos observar este tratamento sendo executado.

	\begin{figure}[!h]
	\centering
	\includegraphics[width=.80\textwidth]{screen_linhacomando} 
	\caption{Tratamento de opções de linha de comando}
	\label{fig:linhacomando} 
	\end{figure}

\section{Módulos}

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum quis auctor nulla. Aenean velit purus, aliquam nec luctus nec, vehicula sed metus. Maecenas non felis id velit lacinia volutpat. Proin sagittis eros quis lectus pulvinar tincidunt. Suspendisse potenti. Sed at neque sit amet magna tincidunt pretium. Praesent fermentum risus a lorem lacinia posuere placerat tortor feugiat. Morbi ligula lorem, malesuada at viverra id, porttitor id dolor. In sit amet arcu leo. Donec auctor imperdiet nulla, sit amet dapibus lectus tincidunt non. Aenean in vulputate mauris. Ut ac neque erat, eget pulvinar odio. In mattis est non eros feugiat nec placerat erat condimentum.


\section{Versionamento}


Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum quis auctor nulla. Aenean velit purus, aliquam nec luctus nec, vehicula sed metus. Maecenas non felis id velit lacinia volutpat. Proin sagittis eros quis lectus pulvinar tincidunt. Suspendisse potenti. Sed at neque sit amet magna tincidunt pretium. Praesent fermentum risus a lorem lacinia posuere placerat tortor feugiat. Morbi ligula lorem, malesuada at viverra id, porttitor id dolor. In sit amet arcu leo. Donec auctor imperdiet nulla, sit amet dapibus lectus tincidunt non. Aenean in vulputate mauris. Ut ac neque erat, eget pulvinar odio. In mattis est non eros feugiat nec placerat erat condimentum.


\section{Documentação}

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum quis auctor nulla. Aenean velit purus, aliquam nec luctus nec, vehicula sed metus. Maecenas non felis id velit lacinia volutpat. Proin sagittis eros quis lectus pulvinar tincidunt. Suspendisse potenti. Sed at neque sit amet magna tincidunt pretium. Praesent fermentum risus a lorem lacinia posuere placerat tortor feugiat. Morbi ligula lorem, malesuada at viverra id, porttitor id dolor. In sit amet arcu leo. Donec auctor imperdiet nulla, sit amet dapibus lectus tincidunt non. Aenean in vulputate mauris. Ut ac neque erat, eget pulvinar odio. In mattis est non eros feugiat nec placerat erat condimentum.


Os capítulos seguintes devem ser definidos de acordo com as especificidades de cada trabalho.

Recomenda-se:

\begin{itemize}
	\item Fundamentação Teórica
	\item Descrição de modelos/módulos desenvolvidos
	\item Resultados Obtidos
	\item Considerações Finais
	\item Sugestões para trabalhos futuros
\end{itemize}


